/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package extracao;

import java.io.IOException;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 *
 * @author Gustavo & Rodrigo
 */
public class ExtracaoCatalogoNovo extends Extracao{
    
    private String URL;
    public DadosHTML extrair(Dados data) throws Exception{

            DadosHTML dadosExtraidos;
            Logger logger = LoggerFactory.getLogger(ExtracaoCatalogoAntigo.class);

            try{

                criarURL(data);
                Document document;
                System.out.println("Antes de conectar URL:"+URL);
                document = Jsoup.connect(URL).get();
                Elements AllElements = document.getAllElements();
                dadosExtraidos = parse(AllElements, data);
                
                return dadosExtraidos;

            } catch (DisciplinaNaoExistente e){
                logger.error(e.codigo);
                throw e;
            }
            catch (IOException e){
                logger.error("Erro de conexão do JSoup");
                throw e;
            }

    }
    
    private DadosHTML parse(Elements AllElements, Dados data) throws DisciplinaNaoExistente{
        int i;
        Element j;
        String codigo = data.getDisciplina().getCodigo().toUpperCase();
        
        
        /*Procura pelo elemento em que o atributo name é igual ao código
        da discplina*/
        for(i=0; i<AllElements.size(); i++) {
            j= AllElements.get(i);
            if(codigo.equals(j.attr("name"))) break;
        }

        String text, prereqs, nome, carga;
        if(i+12<=AllElements.size()){
            /*Com base na estrutura do HTML da pagina podemos acessar os
            dados necessários a partir do indice i. O elemento i contém uma
            div com o nome da discplina, i+1 contém uma div que delimita uma
            string com o vetor de carga horária e os pré-reqs. E i+5 contém
            uma div com a ementa*/

            DadosHTML ParsedHTML = new DadosHTML();

            nome = AllElements.get(i).text().substring(8);
            text = AllElements.get(i+1).text(); /*VetCargaHoraria+Pré-reqs*/
            prereqs = text.substring(text.indexOf("Req")+6); //Pré-Reqs
            carga = text.substring(0,text.indexOf("Pré-Req")-1);//Carga
            text = AllElements.get(i+5).text(); //Ementa

            ParsedHTML.setCodigo(codigo);
            ParsedHTML.setEmenta(text);
            ParsedHTML.setNome(nome);
            ParsedHTML.setPrereqs(prereqs);
            ParsedHTML.setCargaHoraria(carga);

            return ParsedHTML;
        } else {
            Logger logger = LoggerFactory.getLogger(Extracao.class);
            logger.info("Disciplina "+codigo+" não encontrada");
            throw new DisciplinaNaoExistente("Disciplina Não Encontrada");
        }
}
    
    private void criarURL(Dados data) throws IOException {
        
        int ano;
        String prefixo;
        String codigo = data.getDisciplina().getCodigo().toUpperCase();
        
        prefixo = codigo.substring(0,2).toUpperCase();
        
        ano = data.getAnoCatalogo();
        URL = "http://www.dac.unicamp.br/sistemas/catalogos/grad/catalogo" 
              + ano + "/disciplinas/tipo" + prefixo + ".html";
        
        Document document;
        document = Jsoup.connect(URL).get();
        Elements el = document.getElementsContainingOwnText(codigo);            
        URL = el.attr("abs:href");
        
    }
}
